<?php

namespace app\model;

use think\Model;

class Product extends Model
{
    // 开启自动写入时间戳
    protected $autoWriteTimestamp = true;

    // 自定义时间戳字段名
    protected $createTime = 'last_time';
    protected $updateTime = 'last_time';




    /**
     * 关联用户表（查询发布者信息）
     */
    public function publisher()
    {
        // 商品属于用户（product.user_id -> user.id）
        return $this->belongsTo(User::class, 'user_id', 'id')
            ->field('id,nick,avatar'); // 只查询需要的字段，隐藏敏感信息
    }

    /**
     * 商品发布
     * @param $userId String 用户id
     * @param $productDescription String 商品描述
     * @param $productImgs array 商品图片
     * @param $productPrice String 商品价格
     * @param $location String 位置
     * @param $contactType String 联系方式类型
     * @param $contact String 联系方式
     * @param $shippingMethod String 发货方式
     * @return array 商品信息
     */
    public static function publishProduct($userId,$productDescription,$productImgs,$productPrice,$location,$contactType,$contact,$shippingMethod,$id = 0){

        // 数组转为字符串
        $productImgs = json_encode($productImgs, JSON_UNESCAPED_UNICODE);

        // 商品信息
        $productData = [
            'user_id' => $userId,
            'product_description' => $productDescription,
            'product_imgs' => $productImgs,
            'product_price' => $productPrice,
            'location' => $location,
            'contact_type' => $contactType,
            'contact' => $contact,
            'shipping_method' => $shippingMethod,
        ];

        // 判断是否包含商品id 来区分是编辑商品还是发布商品
        if ($id > 0){
            $productData['id'] = $id;
        }


        // 实例化模型
        $productModel = new self();

        // 添加商品信息
        $product = $productModel->save($productData);


        // 返回商品信息
        return [
            'product' => $product
        ];
    }


    /**
     * 通过用户id查询发布的商品
     * @param $userId
     * @param $status
     * @param $currentPage
     * @return \think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function getProductByUserId($userId,$status,$currentPage){

        $query = self::where("user_id", $userId);

        // 如果是-1 则查询所有状态的发布的商品
        if ($status != '-1') {
            $query->where("status", $status);
        }

        $product = $query->order('last_time', 'desc')
            ->page($currentPage, 6)
            ->select();

        return $product;
    }


    /**
     * 删除我发布的已下架的商品
     * @param $userId string 用户id
     * @param $delProductId string 商品id
     * @return bool
     */
    public static function delMyPostsUnlistedProduct($userId,$delProductId){
        $result = self::where("id", $delProductId)
            ->where("user_id", $userId)
            ->where("status", "0")
            ->delete();

        return $result;

    }

    /**
     * 下架我发布的在卖商品
     * @param $userId string 用户id
     * @param $unlistedProductId string 要下架的商品id
     * @return bool
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function unlistedMyPostsForSaleProduct($userId,$unlistedProductId)
    {
        // 先找到模型实例
        $product = self::where('id', $unlistedProductId)
            ->where('user_id', $userId)
            ->find();

        // 商品不存在或不属于该用户
        if (!$product) {
            return false;
        }


        // 修改为下架状态
        $product->status = '0';

        // 添加下架原因
        $product->unlisting_reason = '-1';

        return $product->save();
    }

    /**
     * 重新上架商品
     * @param $userId string 用户id
     * @param $relistProductId string 重新上架商品id
     * @return bool
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function relistProduct($userId,$relistProductId)
    {
        // 模型实例
        $product = self::where('id', $relistProductId)
            ->where('user_id', $userId)
            ->find();

        // 商品不存在或不属于该用户
        if (!$product) {
            return false;
        }


        // 修改为在卖状态
        $product->status = '1';

        // 删除下架原因
        $product->unlisting_reason = '';

        return $product->save();
    }

    /**
     * 获取编辑商品数据
     * @param $userId string 用户id
     * @param $productId string 商品id
     * @return Product|array|false|mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function getEditorProduct($userId,$productId)
    {
        $product = self::where('id', $productId)
            ->where('user_id', $userId)
            ->where('status', '1')
            ->find();

        if (!$product) {
            return false;
        }else{
            return $product;
        }
    }

    /**
     * 首次获取商品列表
     * @return \think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function firstGetProductList()
    {
        $product = self::with('publisher')
                        ->where("status", "1")
                        ->order('last_time', 'desc')
                        ->page(1, 6)
                        ->select();


        return $product;
    }

    /**
     * 获取商品列表
     * @param $currentPage string 当前页
     * @return \think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function getProductList($currentPage)
    {
        $product = self::with('publisher')
            ->where("status", "1")
            ->order('last_time', 'desc')
            ->page($currentPage, 6)
            ->select();

        return $product;
    }

    /**
     * 获取商品详情
     * @param $productId string 商品id
     * @return Product|array|false|mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function getProductInfo($productId)
    {
        $product = self::where('status',1) //处于上架状态的商品
                        ->find($productId);

        if (!$product) {
            return false;
        }
        return $product;
    }


}